Skip to content

[SPIR-V] Honor inline spir-v attributes on functions - #8616

Merged
pow2clk merged 2 commits into
microsoft:mainfrom
mmoult:inline
Jul 30, 2026
Merged

[SPIR-V] Honor inline spir-v attributes on functions#8616
pow2clk merged 2 commits into
microsoft:mainfrom
mmoult:inline

Conversation

@mmoult

@mmoult mmoult commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

The [[vk::ext_decorate]], [[vk::ext_capability]], and [[vk::ext_extension]] attributes were only applied to variables, parameters, stage variables, entry-point functions, and functions carrying [[vk::ext_instruction]]. A plain function that carried them was skipped, so the attributes were silently dropped: no OpDecorate was emitted for its OpFunction, and no OpCapability / OpExtension was added to the module.

Apply them when the function is registered (getOrRegisterFn), next to the existing linkage decoration. This reuses the same helpers as the variable and parameter paths:

  • the decoration goes through a new SpirvFunction overload of decorateWithIntrinsicAttrs, and
  • the capability/extension loops are factored into registerCapabilitiesAndExtensionsForDecl, now shared with the variable path.

Only the literal form of ext_decorate is supported on functions; the id and string variants have no SpirvFunction-target decoration and are now diagnosed rather than silently dropped.

The [[vk::ext_decorate]], [[vk::ext_capability]], and [[vk::ext_extension]]
attributes were only applied to variables, parameters, stage variables,
entry-point functions, and functions carrying [[vk::ext_instruction]]. A
plain function that carried them was skipped, so the attributes were
silently dropped: no OpDecorate was emitted for its OpFunction, and no
OpCapability / OpExtension was added to the module.

Apply them when the function is registered (getOrRegisterFn), next to the
existing linkage decoration. This reuses the same helpers as the variable
and parameter paths:
 - the decoration goes through a new SpirvFunction overload of
   decorateWithIntrinsicAttrs, and
 - the capability/extension loops are factored into
   registerCapabilitiesAndExtensionsForDecl, now shared with the variable
   path.

Only the literal form of ext_decorate is supported on functions; the id and
string variants have no SpirvFunction-target decoration and are now
diagnosed rather than silently dropped.
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@mmoult

mmoult commented Jul 11, 2026

Copy link
Copy Markdown
Contributor Author

@s-perron I don't know how reviews work, but I see you reviewed #8333, which is very similar. Would you please take a look at this one, too?

@s-perron

Copy link
Copy Markdown
Collaborator

I'm not working on DXC anymore. @dnovillo @damyanp, any ideas?

@dnovillo

Copy link
Copy Markdown
Collaborator

I'm not working on DXC anymore. @dnovillo @damyanp, any ideas?

I can review it.

@dnovillo dnovillo added the spirv Work related to SPIR-V label Jul 16, 2026
srcLoc, targetFunc, static_cast<spv::Decoration>(decorate), literals);
assert(decor != nullptr);
mod->addDecoration(decor);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addDecoration used to be used only by decorateLinkage, which always encodes the function name into params. But now two functions both carrying the same decoration will make us drop the second one. This is failing for me:

// RUN: %dxc -T cs_6_0 -E main -fcgl %s -spirv | FileCheck %s

[[vk::ext_decorate(0)]]
[noinline] uint Foo(uint x) { return x; }

[[vk::ext_decorate(0)]]
[noinline] uint Bar(uint x) { return x + 1; }

RWStructuredBuffer<uint> buf;

[numthreads(1, 1, 1)]
void main(uint3 tid : SV_DispatchThreadID) {
  buf[0] = Foo(tid.x) + Bar(tid.x);
}

// CHECK-DAG: OpDecorate %Foo RelaxedPrecision
// CHECK-DAG: OpDecorate %Bar RelaxedPrecision 

The second CHECK-DAG can't find the RelaxedPrecision decoration. I think adding getTargetFunc() in the hash would fix this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep. Fixed, and added a second function in the test to demonstrate.

Comment thread tools/clang/lib/SPIRV/DeclResultIdMapper.cpp

[[vk::ext_decorate_string(/* UserTypeGOOGLE */ 5636, "myType")]]
[noinline] uint Identity(uint x) { return x; }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a second function that exercises ext_decorate_id?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. I called it DecorateId. An apt name, but maybe on the nose.

Comment thread tools/clang/test/CodeGenSPIRV/inline-spirv/spv.intrinsicDecorate.function.hlsl Outdated
@github-project-automation github-project-automation Bot moved this from New to In progress in HLSL Roadmap Jul 17, 2026
@mmoult
mmoult requested a review from dnovillo July 24, 2026 23:22

@dnovillo dnovillo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@pow2clk

pow2clk commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds support for inline SPIR-V decorations, capabilities, and extensions on ordinary functions.

Changes:

  • Applies function-target decorations during registration.
  • Shares capability/extension registration across variables and functions.
  • Adds positive and diagnostic tests for function attributes.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
spv.intrinsicDecorate.function.hlsl Tests supported function attributes.
spv.intrinsicDecorate.function.error.hlsl Tests unsupported decoration variants.
SpirvInstruction.cpp Includes function targets in decoration equality.
SpirvEmitter.cpp Reuses declaration requirement registration.
SpirvBuilder.cpp Adds function decoration construction.
DeclResultIdMapper.h Declares new shared helpers.
DeclResultIdMapper.cpp Applies attributes during function registration.
SpirvModule.h Includes function targets in decoration hashing.
SpirvBuilder.h Exposes function decoration overload.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

// [[vk::ext_decorate(d, ...)]] -> OpDecorate targeting the OpFunction
// [[vk::ext_capability(c)]] -> OpCapability for the module
// [[vk::ext_extension("...")]] -> OpExtension for the module
decorateWithIntrinsicAttrs(fn, spirvFunction);
@damyanp

damyanp commented Jul 30, 2026

Copy link
Copy Markdown
Member

[Auto-generated note from @damyanp]

Did you consider adding a release note?

Per our CONTRIBUTING guidance, user-visible bug fixes and new features usually need an entry in docs/ReleaseNotes.md. If this PR is part of a larger multi-PR effort, a single shared release note across that effort is totally fine.

@pow2clk
pow2clk merged commit 27579ab into microsoft:main Jul 30, 2026
14 checks passed
@github-project-automation github-project-automation Bot moved this from In progress to Done in HLSL Roadmap Jul 30, 2026
@mmoult
mmoult deleted the inline branch July 30, 2026 18:21
@damyanp

damyanp commented Jul 30, 2026

Copy link
Copy Markdown
Member

@pow2clk / @mmoult - it looks like this was merged before addressing / responding to all the feedback?

Can you follow up on these please?

@mmoult

mmoult commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Yes, I agree. The fix is underway. It isn't too big, so I expect to have it up within an hour or two.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

spirv Work related to SPIR-V

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants